package principal;
import java.awt.EventQueue;
import java.awt.SystemColor;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JFormattedTextField;
import javax.swing.JSplitPane;
import javax.swing.JToolBar;
import javax.swing.JSeparator;
import javax.swing.JScrollBar;
import javax.swing.JButton;
import java.awt.Panel;
import javax.swing.JTable;
import javax.swing.border.BevelBorder;
import javax.swing.JTextPane;
import javax.swing.JScrollPane;
import javax.swing.border.SoftBevelBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextArea;

import elementos_grafo.AlgoritmoDeDijkstra;
import elementos_grafo.Grafo;
import elementos_grafo.Lado;
import elementos_grafo.Vertice;
import javax.swing.ImageIcon;


public class PantallaGrafo extends JFrame{
	private JTextField txtNombreDelGrafo;
	private JTextField txtPesoDelLado1;
	private JTextField txtPesoDelLado2;
	private JTextField txtPesoDelLado3;
	private JTextField txtPesoDelLado4;
	private JTextField txtPesoDelLado5;
	private JTextField txtPesoDelLado6;
	private JTextField txtVerticeFin1;
	private JTextField txtVerticeFin2;
	private JTextField txtVerticeFin3;
	private JTextField txtVerticeFin4;
	private JTextField txtVerticeFin5;
	private JTextField txtVerticeFin6;
	private JTextField txtLado1;
	private JTextField txtLado2;
	private JTextField txtLado3;
	private JTextField txtLado4;
	private JTextField txtLado5;
	private JTextField txtLado6;
	private JTextField txtVerticeInicio1;
	private JTextField txtVerticeInicio2;
	private JTextField txtVerticeInicio3;
	private JTextField txtVerticeInicio4;
	private JTextField txtVerticeInicio5;
	private JTextField txtVerticeInicio6;
	private JTextField txtPesoDelLado7;
	private JTextField txtPesoDelLado8;
	private JTextField txtPesoDelLado9;
	private JTextField txtPesoDelLado10;
	private JTextField txtVerticeFin7;
	private JTextField txtVerticeFin8;
	private JTextField txtVerticeFin9;
	private JTextField txtVerticeFin10;
	private JTextField txtLado7;
	private JTextField txtLado8;
	private JTextField txtLado9;
	private JTextField txtLado10;
	private JTextField txtVerticeInicio7;
	private JTextField txtVerticeInicio8;
	private JTextField txtVerticeInicio9;
	private JTextField txtVerticeInicio10;
	private JTextField txtVerticeOrigen;
	private JPanel panelDefinirGrafo;
	private JPanel panelDijkstra;
	private Grafo grafo;
	HashMap<Vertice,Vertice> predecesores;
	private JTextArea txtMostrarCaminos;
	private JLabel lblParaDefinirEl;
	private JLabel lblNewLabel;
	private JLabel lblNewLabel_1;
	private JLabel lblNewLabel_2;
	private JLabel lblElSegundoVertice;
	private JLabel lblNewLabel_3;
	private JLabel lblIncidenteEnEl;
	private JLabel lblVerticeYPor;
	private JLabel lblColumnaPesoDel;
	private JLabel lblNewLabel_4;
	private JPanel panelInstruccionesDefinirGrafo;
	private JPanel panelInstruccionesDijkstra;
	private JLabel label_1;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					new PantallaGrafo().setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public PantallaGrafo() {
		predecesores = new HashMap<Vertice,Vertice>();
		getContentPane().setFont(new Font("Georgia", Font.PLAIN, 11));
		setTitle("Grafos");
		getContentPane().setBackground(SystemColor.activeCaption);
		inicializar();
		panelDefinirGrafo.setVisible(false);
		panelDijkstra.setVisible(false);
		panelInstruccionesDefinirGrafo.setVisible(false);
		panelInstruccionesDijkstra.setVisible(false);
		grafo = new Grafo();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void inicializar() {
		setBounds(100, 100, 623, 551);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(this);
		setResizable(false);
		getContentPane().setLayout(null);
		
		JLabel lblNombreDelGrafo = new JLabel("Nombre del Grafo:");
		lblNombreDelGrafo.setFont(new Font("Georgia", Font.BOLD, 12));
		lblNombreDelGrafo.setBounds(10, 23, 142, 17);
		getContentPane().add(lblNombreDelGrafo);
		
		panelDefinirGrafo = new JPanel();
		panelDefinirGrafo.setBackground(new Color(230, 230, 250));
		panelDefinirGrafo.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		panelDefinirGrafo.setBounds(210, 68, 366, 410);
		panelDefinirGrafo.setLayout(null);
		getContentPane().add(panelDefinirGrafo);
		
		JLabel lblVertices = new JLabel("Definir Grafo");
		lblVertices.setFont(new Font("Georgia", Font.BOLD, 12));
		lblVertices.setBounds(129, 11, 125, 14);
		panelDefinirGrafo.add(lblVertices);
		
		txtPesoDelLado1 = new JTextField();
		txtPesoDelLado1.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado1.setText("10");
		txtPesoDelLado1.setBounds(263, 47, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado1);
		txtPesoDelLado1.setColumns(10);
		
		txtPesoDelLado2 = new JTextField();
		txtPesoDelLado2.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado2.setText("2");
		txtPesoDelLado2.setBounds(263, 78, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado2);
		txtPesoDelLado2.setColumns(10);
		
		txtPesoDelLado3 = new JTextField();
		txtPesoDelLado3.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado3.setText("7");
		txtPesoDelLado3.setBounds(263, 109, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado3);
		txtPesoDelLado3.setColumns(10);
		
		txtPesoDelLado4 = new JTextField();
		txtPesoDelLado4.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado4.setText("9");
		txtPesoDelLado4.setBounds(263, 140, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado4);
		txtPesoDelLado4.setColumns(10);
		
		txtPesoDelLado5 = new JTextField();
		txtPesoDelLado5.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado5.setText("2");
		txtPesoDelLado5.setToolTipText("");
		txtPesoDelLado5.setBounds(263, 173, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado5);
		txtPesoDelLado5.setColumns(10);
		
		txtPesoDelLado6 = new JTextField();
		txtPesoDelLado6.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado6.setText("4");
		txtPesoDelLado6.setBounds(263, 204, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado6);
		txtPesoDelLado6.setColumns(10);
		
		txtVerticeFin1 = new JTextField();
		txtVerticeFin1.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin1.setText("b");
		txtVerticeFin1.setColumns(10);
		txtVerticeFin1.setBounds(199, 47, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin1);
		
		txtVerticeFin2 = new JTextField();
		txtVerticeFin2.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin2.setText("d");
		txtVerticeFin2.setColumns(10);
		txtVerticeFin2.setBounds(199, 78, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin2);
		
		txtVerticeFin3 = new JTextField();
		txtVerticeFin3.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin3.setText("e");
		txtVerticeFin3.setColumns(10);
		txtVerticeFin3.setBounds(199, 109, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin3);
		
		txtVerticeFin4 = new JTextField();
		txtVerticeFin4.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin4.setText("d");
		txtVerticeFin4.setColumns(10);
		txtVerticeFin4.setBounds(199, 140, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin4);
		
		txtVerticeFin5 = new JTextField();
		txtVerticeFin5.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin5.setText("e");
		txtVerticeFin5.setColumns(10);
		txtVerticeFin5.setBounds(199, 173, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin5);
		
		txtVerticeFin6 = new JTextField();
		txtVerticeFin6.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin6.setText("b");
		txtVerticeFin6.setColumns(10);
		txtVerticeFin6.setBounds(199, 204, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin6);
		
		txtLado1 = new JTextField();
		txtLado1.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado1.setText("e1");
		txtLado1.setColumns(10);
		txtLado1.setBounds(129, 47, 40, 20);
		panelDefinirGrafo.add(txtLado1);
		
		txtLado2 = new JTextField();
		txtLado2.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado2.setText("e2");
		txtLado2.setColumns(10);
		txtLado2.setBounds(129, 78, 40, 20);
		panelDefinirGrafo.add(txtLado2);
		
		txtLado3 = new JTextField();
		txtLado3.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado3.setText("e3");
		txtLado3.setColumns(10);
		txtLado3.setBounds(129, 109, 40, 20);
		panelDefinirGrafo.add(txtLado3);
		
		txtLado4 = new JTextField();
		txtLado4.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado4.setText("e4");
		txtLado4.setColumns(10);
		txtLado4.setBounds(129, 140, 40, 20);
		panelDefinirGrafo.add(txtLado4);
		
		txtLado5 = new JTextField();
		txtLado5.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado5.setText("e5");
		txtLado5.setColumns(10);
		txtLado5.setBounds(129, 173, 40, 20);
		panelDefinirGrafo.add(txtLado5);
		
		txtLado6 = new JTextField();
		txtLado6.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado6.setText("e6");
		txtLado6.setColumns(10);
		txtLado6.setBounds(129, 204, 40, 20);
		panelDefinirGrafo.add(txtLado6);
		
		txtVerticeInicio1 = new JTextField();
		txtVerticeInicio1.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio1.setText("a");
		txtVerticeInicio1.setColumns(10);
		txtVerticeInicio1.setBounds(52, 47, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio1);
		
		txtVerticeInicio2 = new JTextField();
		txtVerticeInicio2.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio2.setText("b");
		txtVerticeInicio2.setColumns(10);
		txtVerticeInicio2.setBounds(52, 78, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio2);
		
		txtVerticeInicio3 = new JTextField();
		txtVerticeInicio3.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio3.setText("d");
		txtVerticeInicio3.setColumns(10);
		txtVerticeInicio3.setBounds(52, 109, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio3);
		
		txtVerticeInicio4 = new JTextField();
		txtVerticeInicio4.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio4.setText("e");
		txtVerticeInicio4.setColumns(10);
		txtVerticeInicio4.setBounds(52, 140, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio4);
		
		txtVerticeInicio5 = new JTextField();
		txtVerticeInicio5.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio5.setText("c");
		txtVerticeInicio5.setColumns(10);
		txtVerticeInicio5.setBounds(52, 173, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio5);
		
		txtVerticeInicio6 = new JTextField();
		txtVerticeInicio6.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio6.setText("c");
		txtVerticeInicio6.setToolTipText("");
		txtVerticeInicio6.setColumns(10);
		txtVerticeInicio6.setBounds(52, 204, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio6);
		
		JLabel lblVerticeInicio = new JLabel("V\u00E9rtice Inicio");
		lblVerticeInicio.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblVerticeInicio.setBounds(30, 31, 77, 14);
		panelDefinirGrafo.add(lblVerticeInicio);
		
		JLabel lblLado = new JLabel("Lado");
		lblLado.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblLado.setHorizontalAlignment(SwingConstants.CENTER);
		lblLado.setBounds(125, 31, 46, 14);
		panelDefinirGrafo.add(lblLado);
		
		JLabel lblVerticeFin = new JLabel("V\u00E9rtice Fin");
		lblVerticeFin.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblVerticeFin.setBounds(181, 31, 73, 14);
		panelDefinirGrafo.add(lblVerticeFin);
		
		JLabel lblPesoDelLado = new JLabel("Peso del lado");
		lblPesoDelLado.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblPesoDelLado.setBounds(263, 31, 86, 14);
		panelDefinirGrafo.add(lblPesoDelLado);
		
		txtPesoDelLado7 = new JTextField();
		txtPesoDelLado7.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado7.setText("8");
		txtPesoDelLado7.setColumns(10);
		txtPesoDelLado7.setBounds(263, 235, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado7);
		
		txtPesoDelLado8 = new JTextField();
		txtPesoDelLado8.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado8.setText("3");
		txtPesoDelLado8.setColumns(10);
		txtPesoDelLado8.setBounds(263, 266, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado8);
		
		txtPesoDelLado9 = new JTextField();
		txtPesoDelLado9.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado9.setText("1");
		txtPesoDelLado9.setColumns(10);
		txtPesoDelLado9.setBounds(263, 299, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado9);
		
		txtPesoDelLado10 = new JTextField();
		txtPesoDelLado10.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtPesoDelLado10.setColumns(10);
		txtPesoDelLado10.setBounds(263, 330, 40, 20);
		panelDefinirGrafo.add(txtPesoDelLado10);
		
		txtVerticeFin7 = new JTextField();
		txtVerticeFin7.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin7.setText("d");
		txtVerticeFin7.setColumns(10);
		txtVerticeFin7.setBounds(199, 235, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin7);
		
		txtVerticeFin8 = new JTextField();
		txtVerticeFin8.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin8.setText("c");
		txtVerticeFin8.setColumns(10);
		txtVerticeFin8.setBounds(199, 266, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin8);
		
		txtVerticeFin9 = new JTextField();
		txtVerticeFin9.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin9.setText("c");
		txtVerticeFin9.setColumns(10);
		txtVerticeFin9.setBounds(199, 299, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin9);
		
		txtVerticeFin10 = new JTextField();
		txtVerticeFin10.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeFin10.setColumns(10);
		txtVerticeFin10.setBounds(199, 330, 40, 20);
		panelDefinirGrafo.add(txtVerticeFin10);
		
		txtLado7 = new JTextField();
		txtLado7.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado7.setText("e7");
		txtLado7.setColumns(10);
		txtLado7.setBounds(129, 235, 40, 20);
		panelDefinirGrafo.add(txtLado7);
		
		txtLado8 = new JTextField();
		txtLado8.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado8.setText("e8");
		txtLado8.setColumns(10);
		txtLado8.setBounds(129, 266, 40, 20);
		panelDefinirGrafo.add(txtLado8);
		
		txtLado9 = new JTextField();
		txtLado9.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado9.setText("e9");
		txtLado9.setColumns(10);
		txtLado9.setBounds(129, 299, 40, 20);
		panelDefinirGrafo.add(txtLado9);
		
		txtLado10 = new JTextField();
		txtLado10.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtLado10.setColumns(10);
		txtLado10.setBounds(129, 330, 40, 20);
		panelDefinirGrafo.add(txtLado10);
		
		txtVerticeInicio7 = new JTextField();
		txtVerticeInicio7.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio7.setText("c");
		txtVerticeInicio7.setColumns(10);
		txtVerticeInicio7.setBounds(52, 235, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio7);
		
		txtVerticeInicio8 = new JTextField();
		txtVerticeInicio8.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio8.setText("a");
		txtVerticeInicio8.setColumns(10);
		txtVerticeInicio8.setBounds(52, 266, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio8);
		
		txtVerticeInicio9 = new JTextField();
		txtVerticeInicio9.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio9.setText("b");
		txtVerticeInicio9.setColumns(10);
		txtVerticeInicio9.setBounds(52, 299, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio9);
		
		txtVerticeInicio10 = new JTextField();
		txtVerticeInicio10.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtVerticeInicio10.setColumns(10);
		txtVerticeInicio10.setBounds(52, 330, 40, 20);
		panelDefinirGrafo.add(txtVerticeInicio10);
		
		JButton btnAceptar = new JButton("Aceptar");
		btnAceptar.setBackground(Color.WHITE);
		btnAceptar.setFont(new Font("Georgia", Font.PLAIN, 11));
		btnAceptar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("aceptar");
				if(!txtNombreDelGrafo.getText().equals("")){
					grafo.setNombre(txtNombreDelGrafo.getText());
					grafo.getVertices().setElementos(listaDeVertices());
					grafo.getLados().setElementos(listaDeLados());
					JOptionPane.showMessageDialog(null, "Grafo agregado!");
				}
				else
					JOptionPane.showMessageDialog(null, "Debe insertar el nombre del grafo");
				
			}
		});
		btnAceptar.setBounds(214, 361, 89, 23);
		panelDefinirGrafo.add(btnAceptar);
		
		JButton btnLimpiar = new JButton("Limpiar");
		btnLimpiar.setBackground(Color.WHITE);
		btnLimpiar.setFont(new Font("Georgia", Font.PLAIN, 11));
		btnLimpiar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				limpiar();
			}
		});
		btnLimpiar.setBounds(115, 361, 89, 23);
		panelDefinirGrafo.add(btnLimpiar);
		
		panelDijkstra = new JPanel();
		panelDijkstra.setBackground(new Color(230, 230, 250));
		panelDijkstra.setBounds(210, 70, 366, 408);
		getContentPane().add(panelDijkstra);
		panelDijkstra.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
		panelDijkstra.setLayout(null);
		
		JLabel lblVerticeOrigen = new JLabel("V\u00E9rtice Origen:");
		lblVerticeOrigen.setBounds(10, 26, 87, 14);
		panelDijkstra.add(lblVerticeOrigen);
		
		txtVerticeOrigen = new JTextField();
		txtVerticeOrigen.setBounds(102, 23, 96, 20);
		panelDijkstra.add(txtVerticeOrigen);
		txtVerticeOrigen.setColumns(10);
		
		JButton btnEjecutarAlgoritmo = new JButton("Ejecutar Algoritmo");
		btnEjecutarAlgoritmo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				txtMostrarCaminos.setText("");
				AlgoritmoDeDijkstra algoritmoDeDijkstra = new AlgoritmoDeDijkstra();
				predecesores = algoritmoDeDijkstra.dijkstra(grafo,obtenerVerticeOrigen(txtVerticeOrigen.getText()));
				obtenerCamino(predecesores, txtVerticeOrigen.getText());
			}
		});
		btnEjecutarAlgoritmo.setBounds(204, 22, 152, 23);
		panelDijkstra.add(btnEjecutarAlgoritmo);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(20, 61, 322, 284);
		panelDijkstra.add(scrollPane);
		
		txtMostrarCaminos = new JTextArea();
		scrollPane.setViewportView(txtMostrarCaminos);
		
		txtNombreDelGrafo = new JTextField();
		txtNombreDelGrafo.setFont(new Font("Georgia", Font.PLAIN, 11));
		txtNombreDelGrafo.setText("grafoEjemplo");
		txtNombreDelGrafo.setBounds(151, 21, 137, 20);
		getContentPane().add(txtNombreDelGrafo);
		txtNombreDelGrafo.setColumns(10);
		
		JButton btnDefinirGrafo = new JButton("Definir Grafo");
		btnDefinirGrafo.setFont(new Font("Georgia", Font.PLAIN, 11));
		btnDefinirGrafo.setBackground(new Color(255, 255, 255));
		btnDefinirGrafo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				panelDijkstra.setVisible(false);
				panelInstruccionesDijkstra.setVisible(false);
				panelDefinirGrafo.setVisible(true);
				panelInstruccionesDefinirGrafo.setVisible(true);
			}
		});
		btnDefinirGrafo.setBounds(20, 57, 142, 23);
		getContentPane().add(btnDefinirGrafo);
		
		JButton btnAlgoritmoDijkstra = new JButton("Algoritmo Dijkstra");
		btnAlgoritmoDijkstra.setFont(new Font("Georgia", Font.PLAIN, 11));
		btnAlgoritmoDijkstra.setBackground(new Color(255, 255, 255));
		btnAlgoritmoDijkstra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panelDefinirGrafo.setVisible(false);
				panelInstruccionesDefinirGrafo.setVisible(false);
				panelDijkstra.setVisible(true);
				panelInstruccionesDijkstra.setVisible(true);
			}
		});
		btnAlgoritmoDijkstra.setBounds(20, 91, 142, 23);
		getContentPane().add(btnAlgoritmoDijkstra);
		
		panelInstruccionesDijkstra = new JPanel();
		panelInstruccionesDijkstra.setBackground(SystemColor.activeCaption);
		panelInstruccionesDijkstra.setBounds(10, 132, 190, 85);
		getContentPane().add(panelInstruccionesDijkstra);
		panelInstruccionesDijkstra.setLayout(null);
		
		JLabel label = new JLabel("Instrucciones:");
		label.setFont(new Font("Georgia", Font.BOLD, 12));
		label.setBounds(10, 11, 100, 14);
		panelInstruccionesDijkstra.add(label);
		
		JLabel lblNewLabel_5 = new JLabel("Ingresar el v\u00E9rtice que desea");
		lblNewLabel_5.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblNewLabel_5.setBounds(0, 36, 190, 14);
		panelInstruccionesDijkstra.add(lblNewLabel_5);
		
		JLabel lblNewLabel_6 = new JLabel("sea el origen y hacer click");
		lblNewLabel_6.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblNewLabel_6.setBounds(0, 49, 190, 14);
		panelInstruccionesDijkstra.add(lblNewLabel_6);
		
		JLabel lblNewLabel_7 = new JLabel("en Ejecutar Algoritmo");
		lblNewLabel_7.setFont(new Font("Georgia", Font.PLAIN, 11));
		lblNewLabel_7.setBounds(0, 61, 190, 14);
		panelInstruccionesDijkstra.add(lblNewLabel_7);
		
		panelInstruccionesDefinirGrafo = new JPanel();
		panelInstruccionesDefinirGrafo.setBackground(SystemColor.activeCaption);
		panelInstruccionesDefinirGrafo.setBounds(10, 138, 200, 244);
		getContentPane().add(panelInstruccionesDefinirGrafo);
		panelInstruccionesDefinirGrafo.setLayout(null);
		
		JLabel lblInstrucciones = new JLabel("Instrucciones:");
		lblInstrucciones.setBounds(10, 11, 100, 14);
		panelInstruccionesDefinirGrafo.add(lblInstrucciones);
		lblInstrucciones.setFont(new Font("Georgia", Font.BOLD, 12));
		
		lblParaDefinirEl = new JLabel("Para definir el grafo ingresa ");
		lblParaDefinirEl.setBounds(0, 31, 180, 14);
		panelInstruccionesDefinirGrafo.add(lblParaDefinirEl);
		lblParaDefinirEl.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblNewLabel = new JLabel("en la columna de v\u00E9rtice inicio");
		lblNewLabel.setBounds(0, 46, 191, 14);
		panelInstruccionesDefinirGrafo.add(lblNewLabel);
		lblNewLabel.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblNewLabel_1 = new JLabel("el primer v\u00E9rtice, en la");
		lblNewLabel_1.setBounds(0, 63, 180, 14);
		panelInstruccionesDefinirGrafo.add(lblNewLabel_1);
		lblNewLabel_1.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblNewLabel_2 = new JLabel("columna V\u00E9rtice fin ingresa");
		lblNewLabel_2.setBounds(0, 82, 180, 14);
		panelInstruccionesDefinirGrafo.add(lblNewLabel_2);
		lblNewLabel_2.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblElSegundoVertice = new JLabel("el segundo v\u00E9rtice, en la columna");
		lblElSegundoVertice.setBounds(0, 98, 201, 14);
		panelInstruccionesDefinirGrafo.add(lblElSegundoVertice);
		lblElSegundoVertice.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblNewLabel_3 = new JLabel("lado se debe indicar el lado");
		lblNewLabel_3.setBounds(0, 116, 180, 14);
		panelInstruccionesDefinirGrafo.add(lblNewLabel_3);
		lblNewLabel_3.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblIncidenteEnEl = new JLabel("incidente en el primer  y segundo ");
		lblIncidenteEnEl.setBounds(0, 133, 201, 14);
		panelInstruccionesDefinirGrafo.add(lblIncidenteEnEl);
		lblIncidenteEnEl.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblVerticeYPor = new JLabel("v\u00E9rtice y por ultimo indicar en la");
		lblVerticeYPor.setBounds(0, 150, 201, 14);
		panelInstruccionesDefinirGrafo.add(lblVerticeYPor);
		lblVerticeYPor.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblColumnaPesoDel = new JLabel("columna peso del lado la");
		lblColumnaPesoDel.setBounds(0, 168, 201, 14);
		panelInstruccionesDefinirGrafo.add(lblColumnaPesoDel);
		lblColumnaPesoDel.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		lblNewLabel_4 = new JLabel("ponderaci\u00F3n del lado.");
		lblNewLabel_4.setBounds(0, 184, 201, 14);
		panelInstruccionesDefinirGrafo.add(lblNewLabel_4);
		lblNewLabel_4.setFont(new Font("Georgia", Font.PLAIN, 11));
		
		label_1 = new JLabel("");
		label_1.setIcon(new ImageIcon(PantallaGrafo.class.getResource("/elementos_grafo/grafo.png")));
		label_1.setBounds(210, 114, 332, 323);
		getContentPane().add(label_1);
	}
	
	public ArrayList<Object> listaDeVertices(){
		ArrayList<Object> lista = new ArrayList<Object>();
		ArrayList<Object> listaDeVertices = new ArrayList<Object>();
		
		if(!txtVerticeInicio1.getText().equals(""))
			lista.add(txtVerticeInicio1.getText());
		if(!txtVerticeInicio2.getText().equals(""))
			lista.add(txtVerticeInicio2.getText());
		if(!txtVerticeInicio3.getText().equals(""))
			lista.add(txtVerticeInicio3.getText());
		if(!txtVerticeInicio4.getText().equals(""))
			lista.add(txtVerticeInicio4.getText());
		if(!txtVerticeInicio5.getText().equals(""))
			lista.add(txtVerticeInicio5.getText());
		if(!txtVerticeInicio6.getText().equals(""))
			lista.add(txtVerticeInicio6.getText());
		if(!txtVerticeInicio7.getText().equals(""))
			lista.add(txtVerticeInicio7.getText());
		if(!txtVerticeInicio8.getText().equals(""))
			lista.add(txtVerticeInicio8.getText());
		if(!txtVerticeInicio9.getText().equals(""))
			lista.add(txtVerticeInicio9.getText());
		if(!txtVerticeInicio10.getText().equals(""))
			lista.add(txtVerticeInicio10.getText());
		
		for(int i = 0; i< lista.size(); i++){
			Object repetido = lista.get(i);
			if(i==lista.size()-1)
				i--;
			for(int j = i+1; j < lista.size() ; j++)
				if(repetido.equals(lista.get(j)))
						lista.remove(j);
		}
		
		for(int i = 0; i < lista.size(); i++){
			Vertice vertice = new Vertice();
			vertice.setNombre(lista.get(i).toString());
			listaDeVertices.add(vertice);
		}
		
		return listaDeVertices;
	}
	
	public ArrayList<Object> listaDeLados(){
		ArrayList<Object> lista = new ArrayList<Object>();
		
		
		if(!txtVerticeInicio1.getText().equals("") && !txtVerticeFin1.getText().equals("") && !txtLado1.getText().equals("") && !txtPesoDelLado1.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado1.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio1.getText());
			verticeV.setNombre(txtVerticeFin1.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado1.getText()));
			lista.add(lado);
		}
		if(!txtVerticeInicio2.getText().equals("") && !txtVerticeFin2.getText().equals("") && !txtLado2.getText().equals("") && !txtPesoDelLado2.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado2.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio2.getText());
			verticeV.setNombre(txtVerticeFin2.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado2.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio3.getText().equals("") && !txtVerticeFin3.getText().equals("") && !txtLado3.getText().equals("") && !txtPesoDelLado3.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado3.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio3.getText());
			verticeV.setNombre(txtVerticeFin3.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado3.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio4.getText().equals("") && !txtVerticeFin4.getText().equals("") && !txtLado4.getText().equals("") && !txtPesoDelLado4.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado4.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio4.getText());
			verticeV.setNombre(txtVerticeFin4.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado4.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio5.getText().equals("") && !txtVerticeFin5.getText().equals("") && !txtLado5.getText().equals("") && !txtPesoDelLado5.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado5.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio5.getText());
			verticeV.setNombre(txtVerticeFin5.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado5.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio6.getText().equals("") && !txtVerticeFin6.getText().equals("") && !txtLado6.getText().equals("") && !txtPesoDelLado6.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado6.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio6.getText());
			verticeV.setNombre(txtVerticeFin6.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado6.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio7.getText().equals("") && !txtVerticeFin7.getText().equals("") && !txtLado7.getText().equals("") && !txtPesoDelLado7.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado7.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio7.getText());
			verticeV.setNombre(txtVerticeFin7.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado7.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio8.getText().equals("") && !txtVerticeFin8.getText().equals("") && !txtLado8.getText().equals("") && !txtPesoDelLado8.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado8.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio8.getText());
			verticeV.setNombre(txtVerticeFin8.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado8.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio9.getText().equals("") && !txtVerticeFin9.getText().equals("") && !txtLado9.getText().equals("") && !txtPesoDelLado9.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado9.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio9.getText());
			verticeV.setNombre(txtVerticeFin9.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado9.getText()));
			lista.add(lado);
		}
			
		if(!txtVerticeInicio10.getText().equals("") && !txtVerticeFin10.getText().equals("") && !txtLado10.getText().equals("") && !txtPesoDelLado10.getText().equals("")){
			Lado lado = new Lado();
			lado.setNombre(txtLado10.getText());
			Vertice verticeU = new Vertice();
			Vertice verticeV = new Vertice();
			verticeU.setNombre(txtVerticeInicio10.getText());
			verticeV.setNombre(txtVerticeFin10.getText());
			lado.setU(verticeU);
			lado.setV(verticeV);
			lado.setPeso(Integer.parseInt(txtPesoDelLado10.getText()));
			lista.add(lado);
		}
		return lista;
	}
	
	public Vertice obtenerVerticeOrigen(String vertice){
		Vertice verticeOrigen = null;
		for(Object objVertice : grafo.getVertices().getElementos()){
			Vertice v = (Vertice)objVertice;
			if(v.getNombre().equals(vertice))
				verticeOrigen= v;
		}
		return verticeOrigen;
	}
	
	public HashMap<Vertice, LinkedList<Vertice>> obtenerCamino(HashMap<Vertice,Vertice> predecesores, String origen){
		Vertice verticeOrigen = new Vertice();
		verticeOrigen = obtenerVerticeOrigen(origen);
		HashMap<Vertice, LinkedList<Vertice>> caminos;
		LinkedList<Vertice> listaCaminos= null;
		caminos = new HashMap<Vertice,LinkedList<Vertice>>();
		
		for(Object objVertice : grafo.getVertices().getElementos()){
			listaCaminos = new LinkedList<Vertice>();
			Vertice verticeDestino = (Vertice)objVertice;
			while(!verticeOrigen.equals(verticeDestino) && verticeDestino != null){
				verticeDestino = predecesores.get(verticeDestino);
				if(!verticeOrigen.equals(verticeDestino) && verticeDestino != null)
					listaCaminos.addFirst(verticeDestino);
			}
			if(verticeDestino == null){
			Vertice destino;
			destino = (Vertice)objVertice;
			Vertice noHayCamino = new Vertice();
			noHayCamino.setNombre("No hay camino");
			listaCaminos.add(noHayCamino);
			caminos.put(destino, listaCaminos);
			}else{
				Vertice destino;
				destino = (Vertice)objVertice;
				listaCaminos.addFirst(verticeOrigen);
				listaCaminos.addLast(destino);
				caminos.put(destino, listaCaminos);
			}
		}
		txtMostrarCaminos.append("Vertice Destino     Camino \n");
		
		for(Object objVertice : grafo.getVertices().getElementos()){
			Vertice v = (Vertice)objVertice;
			LinkedList<Vertice> lista = caminos.get(v);
			txtMostrarCaminos.append("              "+v.getNombre()+"                  ");
			for(Vertice v2 : lista){
				txtMostrarCaminos.append(v2.getNombre()+" ");
			}
			txtMostrarCaminos.append("\n");
		}
		return caminos;
	}
	
	public void limpiar(){

		txtVerticeInicio1.setText("");
		txtVerticeInicio2.setText("");
		txtVerticeInicio3.setText("");
		txtVerticeInicio4.setText("");
		txtVerticeInicio5.setText("");
		txtVerticeInicio6.setText("");
		txtVerticeInicio7.setText("");
		txtVerticeInicio8.setText("");
		txtVerticeInicio9.setText("");
		txtVerticeInicio10.setText("");
		txtVerticeFin1.setText("");
		txtVerticeFin2.setText("");
		txtVerticeFin3.setText("");
		txtVerticeFin4.setText("");
		txtVerticeFin5.setText("");
		txtVerticeFin6.setText("");
		txtVerticeFin7.setText("");
		txtVerticeFin8.setText("");
		txtVerticeFin9.setText("");
		txtVerticeFin10.setText("");
		txtPesoDelLado1.setText("");
		txtPesoDelLado2.setText("");
		txtPesoDelLado3.setText("");
		txtPesoDelLado4.setText("");
		txtPesoDelLado5.setText("");
		txtPesoDelLado6.setText("");
		txtPesoDelLado7.setText("");
		txtPesoDelLado8.setText("");
		txtPesoDelLado9.setText("");
		txtPesoDelLado10.setText("");
		txtLado1.setText("");
		txtLado2.setText("");
		txtLado3.setText("");
		txtLado4.setText("");
		txtLado5.setText("");
		txtLado6.setText("");
		txtLado7.setText("");
		txtLado8.setText("");
		txtLado9.setText("");
		txtLado10.setText("");
		txtNombreDelGrafo.setText("");
	}
}

